"""
字典是一种包含键值对（key-value pair）的复合数据类型。
其中字典中的每个键是唯一的，用于存储和快速查找与之相关联的值。
在Python中，字典通常用花括号（{}）表示，用英文逗号（,）将其中的键值对进行分隔，每一个键值对的键和值之间冒号（:）分隔开。基本语法形如:
字典名 = {键:值, 键:值, 键:值, ..., 键:值}
"""
grade_dic = {"xiaoming": 90, "xiaohong": 70, "xiaohei": 60, "xiaogang": 70}
print(grade_dic)
#如果想初始化一个空字典，一般有两种方式可以实现。其基本语法形如
# 字典名 = {}
# 字典名 = dict()
dic1 = {}
dic2 = dict()
print(dic1, dic2)
#字典的查询，通常是希望通过某个特定的键（key）来查询到对应的值（value）。其基本格式如下
# 查询值的结果 = 字典名[键]
# 上述写法其实和列表通过索引来访问元素非常相似。
# 字典的键可以类比列表的索引，键对应的值可以类比列表的值。
# 要注意，查询的时候必须确保键已经位于字典中。
grade_dic = {"xiaoming": 90, "xiaohong": 70, "xiaohei": 60, "xiaogang": 70}
print(grade_dic["xiaoming"])
print(grade_dic["xiaogang"])
#如果只是希望查询某个键是否存在于字典中。通常直接使用成员关键字in来进行。
# 对字典使用成员关键字in的效率，要远高于对列表使用成员关键字in。
grade_dic = {"xiaoming": 90, "xiaohong": 70, "xiaohei": 60, "xiaogang": 70}
print("xiaomei" in grade_dic)     # 输出False
print("xiaoming" in grade_dic)    # 输出True
# 字典也是一个可迭代对象，可以通过for循环遍历来得到字典中的元素。
# 但和集合不同，字典中包含了键值对，所以遍历键、遍历值、遍历键值对的方式稍有不同。
# 字典的keys()、values()、items()方法，分别能够获得字典中的所有键、所有值、所有键值对。
grade_dic = {"xiaoming": 90, "xiaohong": 70, "xiaohei": 60, "xiaogang": 70}
print(list(grade_dic.keys()))        # 获得所有key构成的列表
print(list(grade_dic.values()))      # 获得所有value构成的列表
print(list(grade_dic.items()))       # 获得所有key-value对构成的列表
#添加/修改字典元素的基本语法格式如下
# 字典名[键] = 值
# 如果键本身尚未位于字典中，则字典名[键] = 值会添加新的键值对。
# 如果键本身已经位于字典中，则字典名[键] = 值会直接修改原来的键值对中的值。
grade_dic = {"xiaoming": 90, "xiaohong": 70, "xiaohei": 60, "xiaogang": 70}
grade_dic["xiaomei"] = 100
grade_dic["xiaoming"] = 80
print(grade_dic)
#内置关键字del方法进行字典的中元素的删除，其基本语法为
#del 字典名[键]
#要特别注意，使用del关键字进行字典元素删除时，必须确保该元素已经位于字典中。
grade_dic = {"xiaoming": 90, "xiaohong": 70, "xiaohei": 60, "xiaogang": 70}
del grade_dic["xiaoming"]
print(grade_dic)
# 字典的特点（和集合类似）是：无序性、无重复性、可哈希性。
# 在Python3.7之后，字典中的键值对会保持插入顺序，但是不能够过度依赖于此特性。
# 字典中的键必须是唯一的，不可重复的。
# 如果字典中的键如果不是唯一的话，当我们使用字典名[键]来获得值的话，就不知道取的是哪一个键值对了。
# 所以键必须是唯一的。但字典中的值是允许重复的。这是因为我们总是通过键来访问值，而不是反过来。
# 字典中的键必须是可哈希的。
# 但字典中的值没有限制，可以是任意数据类型，包括列表、字典、集合等可变数据类型都可以作为字典的值。